package com.foundationmade.newbiz.business.businesscard.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.annotation.security.RolesAllowed;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.foundationmade.newbiz.business.businesscard.domain.BusinessCard;
import com.foundationmade.newbiz.business.businesscard.service.BusinessCardService;

import devcken.datatables.serverside.FromServer;
import devcken.datatables.serverside.SortQuery;
import devcken.datatables.serverside.ToServer;
import devcken.hibernate.query.OrderBy;
import devcken.utility.Pair;

/**
 * 명함 관련 요청을 처리하기 위한 인터페이스를 제공한다. 
 * @author Devcken
 */
@Controller
@RequestMapping("/businesscard")
public class BusinessCardController
{
	private final static Logger logger = LoggerFactory.getLogger(BusinessCardController.class);
	
	/**
	 * 명함 관련 DAO를 주입받는다.
	 */
	@Resource(name="businessCardService")
	private BusinessCardService _businessCardService;
	
	/**
	 * 명함 메인 페이지로 이동한다.
	 * @return 명함 메인 페이지에 대한 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "", method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView businesscardMain()
	{
		return new ModelAndView("businesscard.list");
	}
	
	/**
	 * 명함 조회 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param searchCondition 명함 조회에 대한 검색 조건이 전달된다. 
	 * @return 조회된 명함 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/list", method = { RequestMethod.POST })
	public ModelAndView listBusinessCards(HttpServletRequest request,
			ToServer toServer,
			BusinessCard searchCondition)
	{
		FromServer map = new FromServer();
		
		try
		{
			List<Pair<String, OrderBy>> sortConditions = SortQuery.getSortConditions(request, toServer.getiSortingCols());
			
			List<BusinessCard> businessCards = new ArrayList<BusinessCard>(); 
					
			Integer filteredCount = this._businessCardService.listBusinessCards(searchCondition,
					toServer.getPage(),
					toServer.getiDisplayLength(),
					sortConditions,
					businessCards);
			
			map.setiTotalRecords(this._businessCardService.countBusinessCards());
			map.setiTotalDisplayRecords(filteredCount);
			
			map.put("businessCards", businessCards);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 새로운 명함 정보 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param businessCard 저장하려는 명함 정보가 전달된다.
	 * @return 명함 저장 결과를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/save", method = { RequestMethod.POST })
	public ModelAndView saveBusinessCard(HttpServletRequest request, BusinessCard businessCard)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			boolean result = this._businessCardService.saveBusinessCard(businessCard);
			
			map.put("result", result);
			map.put("businessCard", businessCard);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 명함 정보 수정 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param cardId 수정하려는 명함의 아이디가 전달된다.
	 * @param propertyName 수정하려는 명함의 프로퍼티 명이 전달된다.
	 * @param propertyValue 수정하려는 명함의 프로퍼티 값이 전달된다.
	 * @return 명함 저장 결과를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RolesAllowed("ROLE_ADMIN")
	@RequestMapping(value = "/update", method = { RequestMethod.POST })
	public ModelAndView updateBusinessCard(HttpServletRequest request,
			@RequestParam(value = "cardId", required = true)Long cardId,
			@RequestParam(value = "propertyName", required = true)String propertyName,
			@RequestParam(value = "propertyValue", required = true)String propertyValue)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			boolean result = this._businessCardService.updateBusinessCard(cardId, propertyName, propertyValue);
			
			map.put("result", result);
			map.put("cardId", cardId);
			map.put("propertyName", propertyName);
			map.put("updatedValue", propertyValue);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
}